home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
bbsutil
/
hsrc_117.zip
/
TWINDOW.C
< prev
next >
Wrap
Text File
|
1990-11-09
|
21KB
|
1,046 lines
/* TWINDOW.C File */
#include <stdio.h>
#include <ctype.h>
#include <stdarg.h>
#include <dos.h>
#include <alloc.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "twindow.h"
#include "keys.h"
#define TABS 4
#define ON 1
#define OFF 0
#define ERROR -1
/* Local prototypes */
void pascal redraw(WINDOW *wnd);
void pascal dtitle(WINDOW *wnd);
int * pascal waddr(WINDOW *wnd,int x,int y);
void pascal vswap(WINDOW *wnd);
void pascal vsave(WINDOW *wnd);
void pascal vrstr(WINDOW *wnd);
void pascal add_list(WINDOW *wnd);
void pascal beg_list(WINDOW *wnd);
void pascal remove_list(WINDOW *wnd);
void pascal insert_list(WINDOW *w1,WINDOW *w2);
#ifndef FASTWINDOWS
int pascal dget(WINDOW *wnd,int x,int y);
int pascal verify_wnd(WINDOW **w1);
#endif
#ifdef USECLOCK
extern void pascal print_clock(void);
#endif
/* Array of border character sets */
struct {
int nw,ne,se,sw,side,line;
} wcs[]={
{254,24,217,25,179,196}, /* single line */
{254,24,188,25,186,205}, /* double line */
{254,24,189,25,186,196}, /* single top, double side */
{254,24,190,25,179,205}, /* double top, single side */
{194,26,217,27,179,196}, /* pop-down menu */
{201,187,188,200,186,205}, /* double line no cues*/
{254,183,189,211,186,196} /* horizontal menu of pull-down */
};
/* Window structure linked list head & tail */
WINDOW *listhead = NULL;
WINDOW *listtail = NULL;
WINDOW *ewnd=NULL; /* Global error/note window */
int VSG; /* video segment address */
/* Variables which should be set by external functions */
unsigned int vbase=0; /* for pd direct screen funcs if used */
unsigned int maxx=0; /* # columns on screen */
unsigned int maxy=0; /* # rows on screen */
unsigned char current_color=7; /* for pd direct screen funcs if used */
unsigned int videomethod=0; /* for pd direct screen funcs if used */
unsigned char usemouse=0; /* mouse used if non-zero */
int oldmousex=-1,oldmousey,oldmousevid;
int wasconfinedx1=-1,wasconfinedy1,wasconfinedx2,wasconfinedy2;
/* Establish a new window */
WINDOW * pascal establish_window (x,y,h,w) {
WINDOW *wnd;
VSG=(vmode()==7 ? 0xb000: 0xb800);
if ((wnd=(WINDOW *) malloc(sizeof(WINDOW)))==NULL)
return NULL;
/* Adjust for out-of-bounds parameters */
WTITLE="";
HEIGHT=min(h,maxy);
WIDTH=min(w,maxx);
COL=max(0,min(x,maxx-WIDTH));
ROW=max(0,min(y,maxy-HEIGHT));
WCURS=0;
SCROLL=0;
SELECT=1;
BTYPE=0;
VISIBLE=HIDDEN=0;
PREV=NEXT=NULL;
FHEAD=FTAIL=NULL;
WBORDER=WNORMAL=PNORMAL=WTITLEC=clr(BLACK,WHITE,BRIGHT);
WACCENT=clr(WHITE,BLACK,DIM);
if ((SAV=malloc(WIDTH * HEIGHT * 2))==(char *)0) return NULL;
add_list(wnd);
#ifndef FASTWINDOWS
clear_window(wnd);
wframe(wnd);
#endif
return(wnd);
}
/* Set the window's border */
void pascal set_border (WINDOW *wnd,int btype) {
if (verify_wnd(&wnd)) {
BTYPE=btype;
redraw(wnd);
}
}
/* Set colors */
void pascal set_colors (WINDOW *wnd,int area,int bg,int fg,int inten) {
if (vmode()==7) {
if (bg != WHITE && bg !=BLACK) return;
if (fg !=WHITE && fg!=BLACK) return;
}
if(fg==bg) return;
if (verify_wnd(&wnd)) {
if (area==ALL)
while (area)
WCOLOR[--area]=clr(bg,fg,inten);
else WCOLOR[area]=clr(bg,fg,inten);
redraw (wnd);
}
}
/* Set intensity of window */
void pascal set_intensity (WINDOW *wnd,int inten) {
int area=ALL;
if (verify_wnd(&wnd)) {
while (area) {
WCOLOR[--area]&= ~BRIGHT;
WCOLOR[area] |= inten;
}
redraw(wnd);
}
}
/* Set title */
void pascal set_title (WINDOW *wnd,char *title) {
if (verify_wnd(&wnd)) {
WTITLE=title;
redraw(wnd);
}
}
/* Redraw a window when an attribute changes */
static void pascal redraw (WINDOW *wnd) {
#ifndef FASTWINDOWS
int x,y,chat,atr;
for (y=1;y<HEIGHT-1;y++)
for (x=1;x<WIDTH-1;x++) {
chat=dget(wnd,x,y);
atr=(((chat>>8)&255) ==
PNORMAL ? WNORMAL : WACCENT);
displ(wnd,x,y,chat&255,atr);
}
wframe(wnd);
#endif
PNORMAL=WNORMAL;
}
/* Display an established window */
void pascal display_window (WINDOW *wnd) {
if (verify_wnd(&wnd)&& !VISIBLE) {
VISIBLE=1;
#ifdef FASTWINDOWS
if (HIDDEN) {
HIDDEN=0;
vrstr(wnd);
wframe(wnd);
}
else {
vsave (wnd);
clear_window(wnd);
wframe(wnd);
}
#else
vswap(wnd);
#endif
}
}
/* Close all windows */
void pascal close_all() {
WINDOW *sav,*wnd=listtail;
while(wnd) {
sav=PREV;
delete_window(wnd);
wnd=sav;
}
}
/* Remove a window */
void pascal delete_window (WINDOW *wnd) {
if (verify_wnd(&wnd)) {
hide_window(wnd);
free(SAV);
remove_list(wnd); /* remove window from list */
free(wnd);
}
}
/* Hide a window */
void pascal hide_window (WINDOW *wnd) {
if (verify_wnd(&wnd) && VISIBLE) {
#ifndef FASTWINDOWS
vswap(wnd);
#else
vrstr(wnd);
#endif
HIDDEN=1;
VISIBLE=0;
}
}
#ifndef FASTWINDOWS
/* Reposition the window in its 3-axis plane */
void pascal repos_wnd(WINDOW *wnd,int x,int y,int z) {
WINDOW *twnd;
int x1,y1,chat;
if (!verify_wnd(&wnd))
return;
twnd=establish_window(x+COL,y+ROW,HEIGHT,WIDTH);
twnd->_tl=WTITLE;
twnd->btype=BTYPE;
twnd->wcolor[BORDER]=WBORDER;
twnd->wcolor[TITLE]=WTITLEC;
twnd->wcolor[ACCENT]=WACCENT;
twnd->wcolor[NORMAL]=WNORMAL;
twnd->_wsp=SCROLL;
twnd->_cr=WCURS;
if (z!=1) {
remove_list(twnd);
if (z==0)
insert_list(twnd,wnd);
else
beg_list(twnd);
}
for(y1=0;y1<twnd->_wh;y1++)
for (x1=0;x1<twnd->_ww;x1++) {
chat = dget(wnd,x1,y1);
displ(twnd,x1,y1,chat&255,(chat>>8)&255);
}
twnd->_wv=1;
vswap(twnd);
hide_window(wnd);
free(SAV);
remove_list(wnd);
*wnd=*twnd;
insert_list(wnd,twnd);
remove_list(twnd);
free(twnd);
}
#endif
/* Clear window */
void pascal clear_window (WINDOW *wnd) {
register int x1,y1;
if (verify_wnd(&wnd))
for(y1=1;y1<HEIGHT-1;y1++)
for(x1=1;x1<WIDTH-1;x1++)
displ(wnd,x1,y1,' ',WNORMAL);
}
/* Draw the window frame */
void pascal wframe (WINDOW *wnd) {
register int x1,y1;
if (!verify_wnd(&wnd)) return;
/* Window title */
displ(wnd,0,0,NW,WBORDER);
dtitle(wnd);
displ(wnd,WIDTH-1,0,NE,WBORDER);
/* Window sides */
for (y1=1;y1<HEIGHT-1;y1++) {
displ(wnd,0,y1,SIDE,WBORDER);
displ(wnd,WIDTH-1,y1,SIDE,WBORDER);
}
/* Bottom of frame */
displ(wnd,0,y1,SW,WBORDER);
for(x1=1;x1<WIDTH-1;x1++)
displ(wnd,x1,y1,LINE,WBORDER);
displ(wnd,x1,y1,SE,WBORDER);
}
static void pascal dtitle (WINDOW *wnd) {
int x1=1,i,ln;
char *s=WTITLE;
if (!verify_wnd(&wnd)) return;
if (s) {
ln=strlen(s);
if (ln>WIDTH-2)
i=0;
else
i=((WIDTH-2-ln)/2);
if (i>0)
while (i--)
displ(wnd,x1++,0,LINE,WBORDER);
while(*s && x1<WIDTH-1)
displ(wnd,x1++,0,*s++,WTITLEC);
}
while(x1<WIDTH-1)
displ(wnd,x1++,0,LINE,WBORDER);
}
/* Window-oriented printf */
void cdecl wprintf (WINDOW *wnd,char *ln,...) {
char dlin[100],*dl=dlin;
if (verify_wnd(&wnd)) {
va_list ap;
va_start(ap,ln);
vsprintf(dlin,ln,ap);
va_end(ap);
while(*dl)
wputchar(wnd,*dl++);
}
}
/* Window-oriented 'raw' printf */
void cdecl wprintfraw (WINDOW *wnd,char *ln,...) {
char dlin[100],*dl=dlin;
if (verify_wnd(&wnd)) {
va_list ap;
va_start(ap,ln);
vsprintf(dlin,ln,ap);
va_end(ap);
while(*dl)
wputchar(wnd,*dl++);
}
}
/* Write a character to the window */
void pascal wputchar (WINDOW *wnd,int c) {
if (!verify_wnd(&wnd)) return;
switch(c) {
case '\n':
if (SCROLL==HEIGHT-3)
scroll(wnd,UP);
else
SCROLL++;
WCURS=0;
break;
case '\t':
do displ(wnd,(WCURS++)+3,SCROLL+1,' ',WNORMAL);
while ((WCURS%TABS) && (WCURS+1)<WIDTH-1